Reconociendo el Canto de las Aves: CNN y Algoritmos Genéticos en la Extracción de Características de Espectrogramas#
Resumen#
Marco Teórico#
Las Redes Neuronales Convolucionales (CNN) son un tipo de arquitectura de redes neuronales profundas diseñadas específicamente para el procesamiento de datos bidimensionales, como imágenes y vídeos. Han demostrado un rendimiento sobresaliente en una amplia variedad de tareas relacionadas con la visión por computadora. Estas redes revolucionaron el procesamiento de datos al aprender directamente las características relevantes de los datos durante el entrenamiento, en lugar de depender de la extracción manual de características. El nombre “convolucional” proviene de la operación central en la primera capa de estas redes, la convolución. Este enfoque demostró su éxito inicial en tareas como el procesamiento de imágenes y datos similares.
Necesidad de las convoluciones:
En muchas aplicaciones, trabajar directamente con los datos en bruto hace que la tarea sea sencillamente inmanejable. Tomemos el ejemplo de una imagen de matriz 256x256 píxeles, tendríamos un vector de entrada de 65.536 dimensiones. Esto significa que habría aproximadamente 65 millones de parámetros que conectarían cada píxel de entrada con cada nodo de la primera capa, lo que resultaría en una red extremadamente grande y difícil de entrenar.
La complejidad aumenta aún más con imágenes de alta resolución, como 1000x1000 píxeles, y aún más si se trata de imágenes en color con una representación RGB, ya que cada píxel tendría tres valores (rojo, verde y azul), lo que triplicaría la dimensionalidad de la entrada.
Fig. 1 Estructura de una imagen#
Además, a medida que se añaden capas ocultas, el número de parámetros sigue aumentando. Mientras que al emplear convoluciones, se pueden abordar simultáneamente ambos problemas, es decir, el de la explosión de parámetros y el de la extracción de información estadística útil.
Características#
Convolución: Se realiza en la primera capa de estas redes en lugar del producto interno (también conocido como multiplicación de matrices) que se usaba en las redes neuronales totalmente conectadas o feedforward, anteriormente.
No solo aprenden los parámetros de la red (los pesos y sesgos de las neuronas) durante el entrenamiento, sino que también aprenden las características directamente de los datos (La red es capaz de identificar automáticamente patrones y características relevantes en los datos sin necesidad de una etapa de preprocesamiento intensiva).
Pasos básicos de una red convolucional#
Los pasos básicos de cualquier red convolucional son:
Etapa de convolución
El paso de no linealidad
El paso de agrupación
Etapa de convolución#
Fig. 2 Convolución: Reparto de pesos#
La operación de convolución entre dos matrices $H \in R^{mxm}$ e $I \in R^{lxl}$ , es otra matriz definida por:
El resultado anterior se obtiene si colocamos la matriz $H$ de (2 x 2) sobre $I$, empezando por la esquina superior izquierda. Desde un punto de vista físico, el valor $O(1,1)$ resultante es una media ponderada sobre un área local dentro de la matriz $I$
$O(1,1)=h(1,1)I(1,1)+h(1,2)I(1,2)+h(2,1)I(2,1)+h(2,2)I(2,2)$
$O(1,2)=h(1,1)I(1,2)+h(1,2)I(1,3)+h(2,1)I(2,2)+h(2,2)I(2,3)$
$O(2,1)=h(1,1)I(2,1)+h(1,3)I(2,2)+h(2,1)I(3,1)+h(2,2)I(3,2)$
$O(2,2)=h(1,1)I(2,2)+h(1,3)I(2,3)+h(2,1)I(3,2)+h(2,2)I(3,3)$
La operación anterior se conoce como operación de correlación cruzada: operaciones ponderadas sobre los píxeles dentro de un área de ventana de una imagen. se tiene que:
En otras palabras, $O(i,j)$ contiene información en un área de ventana de la matriz de entrada.
El elemento $I(i,j)$ es el elemento superior izquierdo de esta área de la ventana.
El tamaño de la matriz de salida depende de las suposiciones que se adopten sobre cómo tratar los elementos/píxeles en los bordes de I
El tamaño de la ventana depende del valor de $m$
Ejemplo:
Fig. 3 Ejemplo de convolución#
Estas operaciones de filtrado se han utilizado tradicionalmente para generar características a partir de imágenes. La diferencia era que los elementos de la matriz de filtrado se preseleccionaban.
Fig. 4 Ilustración de tres filtros/núcleos#
Profundidad: La profundidad de una capa es el número de matrices de filtro que se emplean en esta capa. No debe confundirse profundidad de la red, que corresponde al número total de capas ocultas utilizadas. A veces, nos referimos al número de filtros como el número de canales.
Campo receptivo: Cada píxel de una matriz de características de salida resulta como una media ponderada de los píxeles dentro de un área específica de la matriz de imágenes de entrada (o de la salida de la capa anterior). El área específica que corresponde a un píxel se conoce como su campo receptivo.
Deslizamiento: En la práctica, en lugar de deslizar la matriz de filtros de píxel en píxel, se puede deslizar, por ejemplo, $s$ píxeles. Este valor se conoce como stride. Para valores de $s>1$, se obtienen matrices de mapas de características de menor tamaño.
Relleno de ceros: A veces, se utilizan ceros para rellenar la matriz de entrada alrededor de los píxeles del borde. De esta forma, la dimensión de la matriz aumenta. Si la matriz original tiene dimensiones.
Se puede ajustar el tamaño de una matriz de mapa de características de salida ajustando el valor del stride,$s$, y el número de columnas y filas cero adicionales en el relleno. En general, se puede comprobar fácilmente que si $H \in R^{mxm}$ e $I \in R^{lxl}$ y $p$ es el número de filas y columnas adicionales para el relleno, entonces el mapa de características tiene dimensiones $k$ x $k$, donde:
$$k=\left \lfloor \frac{l+2p-m}{s} +1 \right \rfloor$$
y $$\left \lfloor . \right \rfloor$$ es el operador suelo.
El paso de la no linealidad#
Una vez que se han realizado las convoluciones y se ha añadido el término de sesgo a todos los valores del mapa de características, el siguiente paso es aplicar una no linealidad (función de activación) a cada uno de los píxeles de cada matriz de mapas de características.Actualmente, la función de activación lineal rectificada, ReLU, parece ser la más popular.
Fig. 5 No linealidad#
La etapa de agrupación#
El objetivo de este paso es reducir la dimensionalidad de cada matriz de mapas de características. A veces, el paso también se denomina pooling espacial. Para ello, se define una ventana y se desliza sobre la matriz correspondiente. El deslizamiento puede realizarse adoptando un valor para el respectivo parámetro stride, $s$ . La operación de pooling consiste en elegir un único valor para representar todos los píxeles que se encuentran dentro de la ventana. La operación más utilizada es la agrupación máxima; es decir, entre todos los píxeles que se encuentran dentro de la ventana, el que tiene el valor más alto es seleccionado. Otra posibilidad es la agrupación en la que se selecciona el valor medio de todos los píxeles; a veces se denomina pooling de suma.
Fig. 6 Agrupamiento#
La siguiente figura muestra el efecto de aplicar el pooling a la imagen de la izquierda. Sin duda, los bordes se vuelven más gruesos, pero la información relacionada con los bordes puede extraerse. Nótese que después de la agrupación, el tamaño de la matriz imagen es reducido. Desde otro punto de vista, el polling resume las estadísticas dentro del área pooling. El pooling puede considerarse un tipo especial de filtrado, en el que, en lugar de la convolución, se selecciona el valor máximo (o medio) de la imagen. El pooling ayuda a que la representación sea aproximadamente invariante a pequeñas traslaciones de la entrada.
Fig. 7 Agrupamiento invariante#
Convolución sobre volúmenes#
Fig. 8 CNN#
Supongamos que la entrada es un volumen de I de $lld$. Nótese que, éste comprende $d$ imágenes, digamos, ** $I_r$ ** , $r=1,2,…d$ cada una de ellas de dimensiones $ll$. Sea H el filtro volumen de $mmd$. Este último comprende el conjunto de $d$ imágenes, ** $H_r$ **, $r=1,2,…d$, cada una de dimensiones $mm$. A continuación, la operación de convolución se define mediante los siguientes pasos:
Convolucionar las correspondientes matrices de imágenes bidimensionales para generar $d$ matrices bidimensionales de salida, es decir:
$O_r=I_r \star H_r$, r=1,2,…,d
La convolución de los dos volúmenes, I y H se define como:
$\sum_{r=1}^{d}O_r$
En otras palabras, al convolución de dos volúmenes da como resultado una matriz bidimensional
3D volúmen $\star$ 3D volúmen = 2D array
Arquitectura CNN completa#
Fig. 9 Arquitectura de una CNN completa#
En la primera capa se emplea un número de volúmenes de filtro (canales) para realizar convoluciones seguidas de la operación no lineal. A continuación, la etapa de pooling toma el relevo para reducir la altura y la anchura de cada volumen de salida, que se utiliza como entrada de la segunda capa, y así sucesivamente. Por último, el volumen de salida de la última capa se vectoriza. A veces, esto también se denomina operación de aplanamiento (flattening: En otras palabras, todos los elementos del volumen de salida se apilan uno debajo de otro para formar un vector)
Metodologia#
Descripción de población y muestra#
Para el desarrollo del presente proyecto, se eligió un conjunto de datos que contiene imágenes de espectrogramas previamente procesados, disponibles en el sitio web Kaggle [Naq23]. Los audios utilizados para generar los espectrogramas, fueron obtenidos del sitio web Xeno-Canto, en el cual se encuentran registros de sonidos de toda clase de fauna alrededor del mundo. Los audios con los cantos de las aves fueron convertidos en espectrogramas utilizando una transformada de Fourier de tamaño 2048 y luego se les aplicó una transformación logarítmica.
Los espectrogramas consisten en una representación visual que muestra cómo se distribuyen las frecuencias en una señal de sonido. Esta representación gráfica puede revelar detalles específicos, como frecuencias elevadas o cambios en la amplitud, que podrían no ser perceptibles incluso si se encuentran dentro del rango auditivo humano [MM13].
La muestra inicial de datos para este proyecto son espectrogramas de 152 especies de aves de la población total de especies de aves presentes en Hawaii, y no se tiene información temporal con respecto al momento en que se registraron los audios.
Durante la realización del análisis exploratorio, y por limitaciones para aplicar técnicas de balanceo de datos, se seleccionan como muestra las 6 especies con mayor cantidad de datos.
Fig. 10 Especie Loxops caeruleirostris (Akeke) junto a su espectograma#
Diccionario de variables#
Los datos utilizados en el proyecto son imágenes de espectrogramas de 152 especies de aves presentes en Hawái. Como se verá más adelante, la cantidad de espectrogramas para cada especie no es igual, por lo que estamos ante un conjunto de datos desbalanceado.
Variable dependiente: Etiquetas con la abreviatura del nombre común de las aves.
Variables explicativas: Vector de características extraídas de imágenes de espectrogramas del espectro de frecuencias de la emisión sonora del canto de las aves.
Los espectogramas, se utilizaron para extraer patrones visuales y características importantes presentes en las imágenes, que permitan identificar las especies de aves. Estas caracteristicas son extraidas al momento de implementar los modelos, y no se tienen de antemano.
Algunas de las caracteristicas extraíadas de los espectrogramas por los modelos son:
Estadísticas de color: Los estadísticos de distribución de color son comunes en la recuperación de imágenes, ya que describen la variación de la intensidad del color en una imagen. En el caso de los espectrogramas de sonido, estos estadísticos se aplican a cada imagen monocroma, permitiendo describir cómo varía la intensidad del sonido en regiones definidas en términos de tiempo y frecuencia. [DDL11]
Direccionalidad: La direccionalidad de la imagen es una característica importante para describir la textura de una imagen. Describe la dirección en la que se concentra o dispersa la textura de la imagen. [SZL+15]
Técnicas#
Para el desarrollo de este modelo se implementaron los siguientes algoritmos de aprendizaje automatico:
Convolutional Neural Network (CNN)
Aprendizaje por trasnferencia con MobileNetV2
Convolutional Neural Network con Algoritmo Genetico (GA)
Diseño general#
El tipo de diseño de investigación utilizado en este trabajo es Mineria de datos. Las etapas consideradas durante el desarrollo del trabajo fueron:
Extracción de datos
Análisis exploratorio de los datos
Procesamiento de datos
Modelado
Evaluación de resultados
Validez#
Resultados y Discusiones#
Exploración de los datos#
Para la exploración de los datos, se utilizaron los audios originales con los cuales se generaron los espectogrmas, ya que estos nos podrian ayudar a entender las diferencias entre los cantos de las aves, y como esto puede ayudar a identificarlas.
Show code cell source
import os
import pandas as pd
import torch
import torchaudio
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
import plotly.express as px
import librosa
import librosa.display
import IPython.display as ipd
import sklearn
import warnings
import seaborn as sns
warnings.filterwarnings('ignore')
Show code cell output
---------------------------------------------------------------------------
ModuleNotFoundError Traceback (most recent call last)
Cell In[1], line 2
1 import os
----> 2 import pandas as pd
3 import torch
4 import torchaudio
ModuleNotFoundError: No module named 'pandas'
Show code cell source
#Metadata de los audios
train_csv=pd.read_csv('C:/Users/kaes1/Desktop/MachineLearningUN/Proyecto/train_metadata.csv')
train_csv.head()
| primary_label | secondary_labels | type | latitude | longitude | scientific_name | common_name | author | license | rating | time | url | filename | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | afrsil1 | [] | ['call', 'flight call'] | 12.3910 | -1.4930 | Euodice cantans | African Silverbill | Bram Piot | Creative Commons Attribution-NonCommercial-Sha... | 2.5 | 08:00 | https://www.xeno-canto.org/125458 | afrsil1/XC125458.ogg |
| 1 | afrsil1 | ['houspa', 'redava', 'zebdov'] | ['call'] | 19.8801 | -155.7254 | Euodice cantans | African Silverbill | Dan Lane | Creative Commons Attribution-NonCommercial-Sha... | 3.5 | 08:30 | https://www.xeno-canto.org/175522 | afrsil1/XC175522.ogg |
| 2 | afrsil1 | [] | ['call', 'song'] | 16.2901 | -16.0321 | Euodice cantans | African Silverbill | Bram Piot | Creative Commons Attribution-NonCommercial-Sha... | 4.0 | 11:30 | https://www.xeno-canto.org/177993 | afrsil1/XC177993.ogg |
| 3 | afrsil1 | [] | ['alarm call', 'call'] | 17.0922 | 54.2958 | Euodice cantans | African Silverbill | Oscar Campbell | Creative Commons Attribution-NonCommercial-Sha... | 4.0 | 11:00 | https://www.xeno-canto.org/205893 | afrsil1/XC205893.ogg |
| 4 | afrsil1 | [] | ['flight call'] | 21.4581 | -157.7252 | Euodice cantans | African Silverbill | Ross Gallardy | Creative Commons Attribution-NonCommercial-Sha... | 3.0 | 16:30 | https://www.xeno-canto.org/207431 | afrsil1/XC207431.ogg |
La información de la metadata del conjunto de datos, tiene información sobre el tipo de canto de la especie (llamado, canción, alerta), las coordenadas en las cuales se realizó la grabación del audio, quien fue el autor de la grabación, la duración de la grabación, entre otros datos. Esta información no será utilizada en el modelo, pero permite conocer un poco más sobre el contexto de los audios.
Show code cell source
# Muestra de audios
base_dir = 'C:/Users/kaes1/Desktop/MachineLearningUN/Audios/train_audio'
train_csv['full_path'] = base_dir+ '/' + train_csv['filename']
# train_csv['full_path'] = base_dir+ '/' + train_csv['primary_label'] + '/' + train_csv['filename']
brnowl = train_csv[train_csv['primary_label'] == "brnowl"].sample(1, random_state = 33)['full_path'].values[0]
comsan = train_csv[train_csv['primary_label'] == 'comsan'].sample(1, random_state = 33)['full_path'].values[0]
houspa = train_csv[train_csv['primary_label'] == "houspa"].sample(1, random_state = 33)['full_path'].values[0]
mallar3 = train_csv[train_csv['primary_label'] == 'mallar3'].sample(1, random_state = 33)['full_path'].values[0]
norcar = train_csv[train_csv['primary_label'] == 'norcar'].sample(1, random_state = 33)['full_path'].values[0]
skylar = train_csv[train_csv['primary_label'] == 'skylar'].sample(1, random_state = 33)['full_path'].values[0]
birds= ["brnowl", "comsan", "houspa", "mallar3", "norcar",'skylar']
Muestra de audios
Para entender porque los cantos de las aves pueden ayudar en la identificación de especies, se muestran a continuación algunos ejemplos de audio obtenidos desde el repositorio de Xeno-canto.
Fig. 11 Especie Alauda arvensis (skylar)#
ipd.Audio(skylar)
Fig. 12 Especie Passer domesticus (houspa)#
ipd.Audio(houspa)